1 module hip.windowing.platforms.x11lib.glx;
2 import hip.windowing.platforms.x11lib.x11;
3 
4 version(X11):
5 
6 alias GLint = int;
7 alias GLubyte = ubyte;
8 alias GLXPixmap = XID;
9 alias GLXDrawable = XID;
10 /* GLX 1.3 and later */
11 struct __GLXcontextRec;
12 alias GLXContext = __GLXcontextRec*;
13 struct __GLXFBConfigRec;
14 alias GLXFBConfig = __GLXFBConfigRec*;
15 alias GLXFBConfigID = XID;
16 alias GLXContextID = XID;
17 alias GLXWindow = XID;
18 alias GLXPbuffer = XID;
19 
20 
21 enum GLX_USE_GL           = 1;
22 enum GLX_BUFFER_SIZE      = 2;
23 enum GLX_LEVEL            = 3;
24 enum GLX_RGBA             = 4;
25 enum GLX_DOUBLEBUFFER     = 5;
26 enum GLX_STEREO           = 6;
27 enum GLX_AUX_BUFFERS      = 7;
28 enum GLX_RED_SIZE         = 8;
29 enum GLX_GREEN_SIZE       = 9;
30 enum GLX_BLUE_SIZE        = 10;
31 enum GLX_ALPHA_SIZE       = 11;
32 enum GLX_DEPTH_SIZE       = 12;
33 enum GLX_STENCIL_SIZE     =	13;
34 enum GLX_ACCUM_RED_SIZE   =	14;
35 enum GLX_ACCUM_GREEN_SIZE =	15;
36 enum GLX_ACCUM_BLUE_SIZE  =	16;
37 enum GLX_ACCUM_ALPHA_SIZE =	17;
38 
39 enum GLX_SAMPLE_BUFFERS = 0x186a0; /*100000*/
40 enum GLX_SAMPLES        = 0x186a1; /*100001*/
41 
42 
43 /*
44  * GLX 1.3 and later:
45  */
46 enum GLX_CONFIG_CAVEAT		     = 0x20;
47 enum GLX_DONT_CARE			     = 0xFFFFFFFF;
48 enum GLX_X_VISUAL_TYPE		     = 0x22;
49 enum GLX_TRANSPARENT_TYPE		 = 0x23;
50 enum GLX_TRANSPARENT_INDEX_VALUE = 0x24;
51 enum GLX_TRANSPARENT_RED_VALUE	 = 0x25;
52 enum GLX_TRANSPARENT_GREEN_VALUE = 0x26;
53 enum GLX_TRANSPARENT_BLUE_VALUE	 = 0x27;
54 enum GLX_TRANSPARENT_ALPHA_VALUE = 0x28;
55 enum GLX_WINDOW_BIT			     = 0x00000001;
56 enum GLX_PIXMAP_BIT			     = 0x00000002;
57 enum GLX_PBUFFER_BIT		     = 0x00000004;
58 enum GLX_AUX_BUFFERS_BIT	     = 0x00000010;
59 enum GLX_FRONT_LEFT_BUFFER_BIT   = 0x00000001;
60 enum GLX_FRONT_RIGHT_BUFFER_BIT  = 0x00000002;
61 enum GLX_BACK_LEFT_BUFFER_BIT    = 0x00000004;
62 enum GLX_BACK_RIGHT_BUFFER_BIT   = 0x00000008;
63 enum GLX_DEPTH_BUFFER_BIT	     = 0x00000020;
64 enum GLX_STENCIL_BUFFER_BIT	     = 0x00000040;
65 enum GLX_ACCUM_BUFFER_BIT  	     = 0x00000080;
66 enum GLX_NONE			         = 0x8000;
67 enum GLX_SLOW_CONFIG		     = 0x8001;
68 enum GLX_TRUE_COLOR			     = 0x8002;
69 enum GLX_DIRECT_COLOR		     = 0x8003;
70 enum GLX_PSEUDO_COLOR		     = 0x8004;
71 enum GLX_STATIC_COLOR		     = 0x8005;
72 enum GLX_GRAY_SCALE			     = 0x8006;
73 enum GLX_STATIC_GRAY		     = 0x8007;
74 enum GLX_TRANSPARENT_RGB	     = 0x8008;
75 enum GLX_TRANSPARENT_INDEX	     = 0x8009;
76 enum GLX_VISUAL_ID			     = 0x800B;
77 enum GLX_SCREEN			         = 0x800C;
78 enum GLX_NON_CONFORMANT_CONFIG   = 0x800D;
79 enum GLX_DRAWABLE_TYPE		     = 0x8010;
80 enum GLX_RENDER_TYPE		     = 0x8011;
81 enum GLX_X_RENDERABLE		     = 0x8012;
82 enum GLX_FBCONFIG_ID		     = 0x8013;
83 enum GLX_RGBA_TYPE			     = 0x8014;
84 enum GLX_COLOR_INDEX_TYPE	     = 0x8015;
85 enum GLX_MAX_PBUFFER_WIDTH	     = 0x8016;
86 enum GLX_MAX_PBUFFER_HEIGHT	     = 0x8017;
87 enum GLX_MAX_PBUFFER_PIXELS	     = 0x8018;
88 enum GLX_PRESERVED_CONTENTS	     = 0x801B;
89 enum GLX_LARGEST_PBUFFER	     = 0x801C;
90 enum GLX_WIDTH			         = 0x801D;
91 enum GLX_HEIGHT			         = 0x801E;
92 enum GLX_EVENT_MASK			     = 0x801F;
93 enum GLX_DAMAGED			     = 0x8020;
94 enum GLX_SAVED			         = 0x8021;
95 enum GLX_WINDOW			         = 0x8022;
96 enum GLX_PBUFFER			     = 0x8023;
97 enum GLX_PBUFFER_HEIGHT          = 0x8040;
98 enum GLX_PBUFFER_WIDTH           = 0x8041;
99 enum GLX_RGBA_BIT			     = 0x00000001;
100 enum GLX_COLOR_INDEX_BIT	     = 0x00000002;
101 enum GLX_PBUFFER_CLOBBER_MASK    = 0x08000000;
102 
103 
104 enum GLX_CONTEXT_MAJOR_VERSION_ARB = 0x2091;
105 enum GLX_CONTEXT_MINOR_VERSION_ARB = 0x2092;
106 enum GLX_CONTEXT_FLAGS_ARB         = 0x2094;
107 enum GLX_CONTEXT_PROFILE_MASK_ARB  = 0x9126;
108 
109 enum GLX_CONTEXT_DEBUG_BIT_ARB                  = 0x0001;
110 enum GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB     = 0x000;
111 enum GLX_CONTEXT_CORE_PROFILE_BIT_ARB           = 0x00000001;
112 enum GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB  = 0x00000002;
113 	
114 alias glXCreateContextAttribsARBProc = extern(C) nothrow @nogc GLXContext function(Display*, GLXFBConfig, GLXContext, Bool, const(int)*);
115 alias glXSwapIntervalEXTProc = extern(C) nothrow @nogc void function(Display *dpy, GLXDrawable drawable, int interval);
116 alias glXSwapIntervalSGIProc = extern(C) nothrow @nogc int function(int interval);
117 alias glXSwapIntervalMESAProc = extern(C) nothrow @nogc int function(int interval);
118 
119 glXSwapIntervalEXTProc glXSwapIntervalEXT;
120 glXSwapIntervalMESAProc glXSwapIntervalMESA;
121 glXSwapIntervalSGIProc glXSwapIntervalSGI;
122 
123 ///https://www.khronos.org/opengl/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
124 nothrow @system @nogc
125 bool isExtensionSupported(const char *extList, const char *extension)
126 {
127     import core.stdc.string;
128     const(char)* start;
129     const(char)* where, terminator;
130   
131     /* Extension names should not have spaces. */
132     where = strchr(extension, ' ');
133     if (where || *extension == '\0')
134         return false;
135 
136     /* It takes a bit of care to be fool-proof about parsing the
137         OpenGL extensions string. Don't be fooled by sub-strings,
138         etc. */
139     for (start=extList;;) 
140     {
141         where = strstr(start, extension);
142 
143         if (!where)
144         break;
145 
146         terminator = where + strlen(extension);
147 
148         if ( where == start || *(where - 1) == ' ' )
149         if ( *terminator == ' ' || *terminator == '\0' )
150             return true;
151 
152         start = terminator;
153     }
154 
155     return false;
156 }